/**
 1.SAX 是 simple API for XML 的缩写
 SAX是读取和操作XML数据更快速，更轻量的方法。SAX允许您在读取文档时处理它，从而不必等待整个文档被存储之后才采取操作。
 它不涉及DOM所必须的开销和概念跳跃。SAX API是一个基于事件的API,适用于处理数据流，即随着数据的流动而以此处理数据。
 SAX API在其解析您的文档时发生一定事件的时候会通知您。在您对其响应时，您不作保存的数据将会被抛弃。

 SAX API 中主要有4种处理事件的接口。 1.contenthandler， DTDhandler, EntityResovler, ErrorHandler
 DefaultHandler 实现了这4个处理器的接口，
 1.创建SAX解析器工厂对象
 SAXParserFactory spf=SAXParserFactory.newInstance();
 2.使用解析器工厂创建解析器实例
 SAXParser saxParser=spf.newSAXPaser();
 3.创建SAX解析器要使用的事件侦听器对象
 PersonHandler handler=new PersonHandler();
 4.开始解析文本
 saxPaser.parse(new File(file name),handler);

 #########################
 ####此项目的文件 和作用#####
 ########################

 1.xml  数据文件      数据传输和解析文本
 2.People 类         定义需要解析的字段
 3.peopleHandler类   解析的算法 （需要自己写，需要继承DefaultHandler)
 4.XMLRUN            执行步骤


 */


package 第十七章_XML与JSON.XML_SAXj;

import org.junit.Test;
import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class XMLRUN {
    @Test
    public void saxparserXML() throws ParserConfigurationException, SAXException, IOException {
        //1.创建一个SAX解析工厂的对象
        SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
        //2.创建一个SAX解析器对象
        SAXParser saxParser = saxParserFactory.newSAXParser();
        //3.创建一个XML的处理器对象
        PersonHandler personHandler = new PersonHandler();
        //4.创建字节流 对象 --放置文件路径
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("第十七章_XML与JSON/XML_SAXj/People.xml");
        //5.使用解析器的解析功能 连接 字节流对象 和 处理器对象
        saxParser.parse(is,personHandler);
        List<Person> persons=personHandler.getPersons();
        for(Person p:persons){
            System.out.println(p);
        }
    }
}
